前面兩天詳細介紹了投影矩陣和 3D 轉換矩陣,這篇文章要總結一下,讀者如果沒有時間,可以跳過前面,直接看這篇的結論。我們也會介紹一些實作上的細節,這部分如果只是讀論領域內的論文而缺少實作經驗的話,時常會搞混。
前面講了很多,就是為了要介紹如何方便的表達相機姿態+投影,假如有一個3D空間的點 (x, y, z),已知相機的姿態 和投影參數 ,我們可以直接用兩個矩陣乘法計算出他在圖片上的像素座標 (u, v)
通常以下的名詞代表以上這些資訊
這裡要介紹一個筆者認為初學者很容易搞混的部分,釐清這個概念有助於實作。前面介紹用 R,t 去描述 camera pose,不過如果我們說這個 camera pose,實際上有兩種可能的定義 World to camera (先前介紹的是這個) 和 Camera to world。
差別在於,”乘上這個矩陣後,這個 3D 的點,是從 camera coordinate (相機座標系) 轉換到 world coordinate (世界座標系) ,還是反過來,從 world coordinate 轉換到 camera coordinate,下圖為例:
所謂 camera coordinate 就是指,這個任一個點的座標,都是以該相機作為原點來表達,也就是說,在這個座標裡的點,只要乘上投影矩陣,就會得到圖片中的二維座標了。而 world coordinate 就是指原本的座標系了。
因此我們前面提到的這個轉換+投影的公式,文字上的解釋就是,給定一個 world coordinate中的3D 點,我們先用 world-to-camera 的轉換轉到 以camera 位置作為原點的座標系,再做投影。
把這個轉換想做函數的話,兩者之間其實就是一個反函數的關係,也就是可以用反矩陣 互相轉換。
假使拿到一個數據集或是使用某些程式庫,裡面提到camera pose 矩陣或是extrinsic parameters (外部參數) 時就要很小心,有可能是 camera-to-world 或是 world-to-camera。
還有一個可能的變化:矩陣乘法的順序,有些定義可能是轉換矩陣乘在左邊,有些可能是乘在右邊,這個也要小心。
筆者與身邊的朋友常遇到的事情就是:在一個新的數據集上做實驗時,如果文件定義不清楚,常常要花許多時間在測試座標轉換,非常痛苦。
我們可以利用以下資訊,計算一個 3D 空間的點 (x, y, z) 在圖片上的像素座標 (u, v)
camera intrinsic: 投影相關的參數
camera extrinsic: 相機的旋轉和位移
實作上小心 camera-to-world 還是 world-to-camera,可以用反矩陣互相轉換
這裡介紹表達方式屬於電腦視覺與機器人領域常用的,例如大家常用的 OpenCV 程式庫,然而不同的系統或是程式庫可能會有細微定義上的不同,需要小心